package com.clx.nettry;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class AppServer {

    private int port;

    public AppServer(int port){
        this.port = port;
    }

    public void start(){
        //1.创建eventloop，老板只负责处理请求，之后会将请求重新发送至worker
        // “老板”线程组：负责「接受客户端连接」
        EventLoopGroup boss = new NioEventLoopGroup(2);
        // “工人”线程组：负责「处理连接后的 I/O 操作」
        EventLoopGroup worker = new NioEventLoopGroup(10);

        try {

        //2需要一个服务器引导程序
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        //3.配置服务器
        serverBootstrap = serverBootstrap
                // 绑定“老板/工人”线程组
                .group(boss,worker)
                // 指定「服务端接受连接的通道类型」为 NIO 实现
                .channel(NioServerSocketChannel.class)
                // 配置「客户端连接通道的初始化逻辑
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        // 向“客户端连接通道”的「处理器管道（Pipeline）」中，添加自定义处理器 MyChannelHandler
                        socketChannel.pipeline().addLast(new MyChannelHandler());
                    }
                });
        //4.绑定端口，并「同步等待绑定完成」
        ChannelFuture channelFuture =serverBootstrap.bind(port).sync();

        //closeFuture().sync()：让服务端 “阻塞等待”，直到通道被关闭（比如程序停止时）
        channelFuture.channel().closeFuture().sync();
        }catch (InterruptedException e){
            e.printStackTrace();
        }finally {
            try {
                // 优雅关闭“老板/工人”线程组（等待已有任务完成，再释放资源）
                boss.shutdownGracefully().sync();
                worker.shutdownGracefully().sync();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    public static void main(String[] args) {
        new AppServer(8080).start();
    }
}
